/*
话说发源于小朋友精心设计的游戏被电脑组的童鞋们藐杀之后非常不爽，为了表示安慰和鼓励，VIP999 决定请他吃一次“年年大丰收”，为了表示诚意，他还决定亲自去钓鱼。
但是，因为还要准备 NOIP2013, z 老师只给了他 H 个小时的空余时间，假设有 n 个鱼塘都在一条水平路边，从左边到右编号为 1,2,3…n 。
VIP 是个很讲究效率的孩子他希望用这些时间钓到尽量多的鱼。他从湖1出发，向右走，有选择的在一些湖边停留一定的时间钓鱼最后在某一个湖边结束钓鱼他测出从第i个湖到i+1个湖需要走5×ti分钟的路还测出在第i个湖边停留第一个5分钟可以钓到鱼fi以后再每钓5分钟鱼鱼量减少di
​。为了简化问题，他假定没有其他人钓鱼，也不会有其他因素影响他钓到期望数量的鱼。请编程求出能钓最多鱼的数量。
输入格式
第一行：湖的数量 n。
第二行：时间 h（小时）。
第三行：n 个数，f1,f2,…,fn。
第四行：n 个数，d1,d2,…,dn。
第五行：n−1 个数，t1,t 2,…,tn−1
输出格式
一个数，所能钓鱼的最大数量。
*/

#include<bits/stdc++.h>
#define endl "\n"
#define ll long long
#define all(rq) rq.begin(),rq.end()
#define max(a,b) (a<b?b:a)
#define min(a,b) (a<b?a:b)

using namespace std;
const int INF=0x3f3f3f3f;

int main(){
	int n,h;
	cin>>n>>h;
	h*=12;
	vector<int> f(n+100);
	vector<int> d(n+100);
	vector<int> t(n+100);
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
	for(int i=1;i<=n;i++){
		cin>>d[i];
	}
	t[1]=0; 
	for(int i=2;i<=n;i++){ //t[i]转换为由i-1到i所花的时间 
		cin>>t[i];
	}
	
	vector<int> dp(h+100); //dp[i][j]表示以第i个湖结尾并且总共花j时间能获得的最大鱼量 在第i个湖钓k次鱼能获得的收益为k*f[i]-d[i]*k*(k-1)/2 所耗费的时间为 5*(t[i]+k) 那么以i-1结尾的湖 所以dp[i][j]=Max(dp[i-1][j-5*(t[i]+k)]+k*f[i]-d[i]*k*(k-1)/2) 
	int ans=0;
	for(int i=1,tmp=t[1];i<=n;tmp+=t[i+1],i++){
		vector<int> temp=dp;
		dp=vector<int>(h+100,0); //滚动数组记得置0
		for(int j=tmp;j<=h;j++){
			for(int k=0;k<=j-tmp;k++){
				dp[j]=max(dp[j],temp[j-t[i]-k]+max(k*f[i]-k*(k-1)/2*d[i],0));
				ans=max(ans,dp[j]);
			}
		}
	}
	
	cout<<ans<<endl;
	return 0;
}